class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        // 和上一道无重叠区间一样，使区间尽可能挨在一起，达到使用最少弓箭数射爆的目的
        sort(points.begin(), points.end());

        // 这里ret要先初始化为1，因为无论如何最少都要一根弓箭(题目中points数组最少为1)
        int n = points.size(), ret = 1;
        for(int i = 1; i < n; i++)
        {
            if(points[i][0] <= points[i - 1][1])
            {
                // 该气球与上一个重叠，更新右边界
                points[i][1] = min(points[i - 1][1], points[i][1]);
            }
            else
            {
                // 该气球不与上一个气球重叠，故需要1只弓箭射爆
                ret++;
            }

        }
        return ret;
    }
};